package 深浅拷贝;

import org.w3c.dom.css.CSSUnknownRule;

class Money implements Cloneable{
    public double money=12.25;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Worker implements Cloneable{
    public String name;
    public Money m=new Money(); //这叫做组合

    @Override
    public String toString() {
        return "Worker{" +
                "name='" + name + '\'' +
                ", money=" + m +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //只克隆了worker对象
        Worker worker=(Worker) super.clone();
        //克隆了worker对象里面的m对象
        worker.m=(Money) this.m.clone();   //this是worker1
        return worker;
        //return super.clone();  //其实拿到的是一个student对象  浅拷贝  super.clone其实是把this的对象拷贝一份
    }
}
public class Copy {
    public static void main(String[] args) throws CloneNotSupportedException{
        //shallowcopy  特点是:当一个引用拷贝了另一个引用指向的对象时，改变原来对象的值，会影响到拷贝之后对象的值
        Worker worker1=new Worker();    //worker1在堆中存放了name和一个引用m，而m又是一个引用，所有也存在一个对象
        Worker worker2=(Worker)worker1.clone();  //clone方法的返回值是一个object,而object是所有类的父类，所以这里会发生向下转型
        worker1.m.money=99;
        System.out.println(worker1.m.money);//worker2不仅拷贝了worker1中的name，还拷贝了引用m，
        System.out.println(worker2.m.money);//而引用m指向的对象并没有发生变化，所以二个对象的m都指向同一个对象，所以改变一个对象中m的值会影响另一个的

        //deepcopy   特点是:当前对象里面的每一个对象都需要克隆。当一个引用拷贝了另一个引用指向的对象时，改变原来对象的值，不会影响到拷贝之后对象的值

    }
}
